package Day_0218.JavaBase;

/**
 * @author zxc
 * @date 2023/02/18 11:37
 **/
public class Polymorphic_Definiton {
    public static void main(String[] args) {
        /**
         * 谈一谈对于 多态的理解
         * ===》
         * 1.允许不同类对象，对同一消息做出响应，
         * （1）即，同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用)。
         * （2）即，父类型的引用，指向子类型的对象。
         *
         * 2.主要有以下优点：
         * （1）可替换性：多态对已存在代码具有可替换性;
         * （2）可扩充性：增加新的子类,不影响已经存在的类结构;
         * （3）更加灵活;
         *
         * 3.所谓，多态就是指，程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用
         * （1）在编程时并不确定，而是在程序运行期间才确定，
         *  即，一个引用变量到底会指向哪个类的实例对象，该引用变量发出的方法调用到底是哪个类中实现的方法，必须在由程序运行期间才能决定。
         *  因为在程序运行时才确定具体的类，这样，不用修改源程序代码，就可以让引用变量绑定到各种不同的类实现上，
         *  从而导致该引用调用的具体方法随之改变，
         *  即，不修改程序代码就可以改变程序运行时所绑定的具体代码，让程序可以选择多个运行状态，这就是多态性。
         * （2）多态分为编译时多态和运行时多态。
         *  a.其中，编辑时多态是静态的，主要是指方法的重载，
         *  它是根据参数列表的不同来区分不同的函数，通过编辑之后会变成两个不同的函数，在运行时谈不上多态。
         *  b.而运行时多态是动态的，它是通过动态绑定来实现的，也就是我们所说的多态性。
         *  方法重写，就是运行时多态，即，子类继承父类并重写父类中已有的或抽象的方法。
         *
         */

        /**
         * 多态实现的必要条件
         * ===》
         * 1.Java实现多态有三个必要条件：继承、重写、向上转型。
         * （1）继承：
         *  在多态中必须存在有继承关系的子类和父类。
         * （2）重写：
         *  子类对父类中某些方法进行重新定义，在调用这些方法时就会调用子类的方法。
         * （3）向上转型：
         *  在多态中需要将子类的引用赋给父类对象，只有这样该引用才能够具备技能调用父类的方法和子类的方法。
         * ===》
         * 只有满足了上述三个条件，我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象，从而达到执行不同的行为。
         *
         * 2.对于Java而言，它多态的实现机制遵循一个原则：
         * 当超类对象引用变量引用子类对象时，被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法，
         * 但是这个被调用的方法必须是在超类中定义过的，也就是说被子类覆盖的方法。
         *
         */

        /**
         * 具体如何对于多态进行实现
         * ==》
         * 实现多态主要有以下三种方式：
         * 1. 接口实现;
         * 2. 继承父类重写方法;（OverWrite）
         * 3. 同一类中进行方法重载;（OverLoad）
         *
         */
    }
}
